package cn.dlc.com.biz.qd.controller;

import cn.dlc.com.biz.core.Constants;
import cn.dlc.com.biz.qd.entity.Qd;
import cn.dlc.com.biz.user.entity.User;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.junit.platform.commons.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import static cn.dlc.com.biz.core.Constants.ROOM_USER_PREFIX;

/**
 * @Author dlc
 * @Date 2024/1/13
 * @Description TODO
 * @Version 0.0.1
 */
@Slf4j
@RestController
@RequestMapping("qd")
@Api(tags = {"抢答相关"})
public class QdController {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @ApiOperation(value = "主持人开始抢答", tags = {"抢答相关"})
    @GetMapping("init/{roomNumber}")
    public Map<String, Object> init(@PathVariable("roomNumber") String roomNumber){
        // 获取当前时间
        long currentTime = System.currentTimeMillis();
        Map<String, Object> result = new HashMap<>();
        // 返回一个当前时间，作为题目的编号
        result.put("questionNumber", currentTime);

        // 添加到题目的历史记录
        redisTemplate.opsForZSet().add(Constants.ROOM_QUESTION_HISTORY_PREFIX + roomNumber, currentTime + "", currentTime);

        // 设置开始的标志
        redisTemplate.opsForValue().set(Constants.START_FLAG + roomNumber, currentTime + "");

        return result;
    }

    @ApiOperation(value = "主持人结束抢答", tags = {"抢答相关"})
    @GetMapping("end/{roomNumber}")
    public Map<String, Object> end(@PathVariable("roomNumber") String roomNumber){

        Map<String, Object> result = new HashMap<>();
        // 设置开始的标志
        redisTemplate.delete(Constants.START_FLAG + roomNumber);

        // 主持人结束
        result.put("result","ok");

        return result;
    }

    @ApiOperation(value = "参赛选手抢答", tags = {"抢答相关"})
    @PostMapping("start")
    public Map<String, Object> qd(@RequestBody Qd qd){

        Map<String, Object> result = new HashMap<>();


        // 获取到题目的 key
        String questionNumber = redisTemplate.opsForValue().get(Constants.START_FLAG + qd.getRoomNumber());
        // 如果这个key是空的，表示没有开始，或者被主动结束了
        if(StringUtils.isBlank(questionNumber)) {
            result.put("qdResult","比赛还没开始"); // 返回抢答结果
            return result;

        }

        // 如果已经有人抢到了
        if("over".equals(questionNumber)) {
            result.put("qdResult","已经有人抢到了");
            return result;
        }

        // 没有人抢到，那么拿锁，我来抢
        Boolean qd_lock = redisTemplate.opsForValue().setIfAbsent("qd_lock", questionNumber, 2, TimeUnit.MINUTES);

        if(Boolean.TRUE.equals(qd_lock)) {
            // 拿到了锁
            User user = new User();
            // 获取到传递过来的questionNumber 和 userId 和 nickName
            user.setId(qd.getUserId());
            user.setNickName(qd.getNickName());

            // 1、存放当前选手的抢答时间
            redisTemplate.opsForZSet().add(Constants.QUESTION_QD_HISTORY_PREFIX + questionNumber, JSONObject.toJSONString(user), System.currentTimeMillis());

            // 2、设置抢答结束的标志
            redisTemplate.opsForValue().set(Constants.START_FLAG + qd.getRoomNumber(), "over");

            // 3、释放锁
            redisTemplate.delete("qd_lock");

            // 4、设置返回结果
            result.put("qdResult","ok"); // 返回抢答结果

            return result;
        }

        result.put("qdResult","加油！！"); // 返回抢答结果

        return result;

    }

    @ApiOperation(value = "抢答的问题汇总", tags = {"抢答相关"})
    @GetMapping("question/history/list/{roomNumber}")
    public Map<String, Object> questionHistoryList(@PathVariable("roomNumber") String roomNumber){
        Map<String, Object> result = new HashMap<>();
        // 添加到题目的历史记录
        Set<String> historyList = redisTemplate.opsForZSet().range(Constants.ROOM_QUESTION_HISTORY_PREFIX + roomNumber, 0, -1);

        result.put("questionHistoryList", historyList);

        return result;
    }

    @ApiOperation(value = "指定问题的抢答结果", tags = {"抢答相关"})
    @PostMapping("qd/history/list/{questionNumber}")
    public Map<String, Object> qd(@PathVariable("questionNumber") String questionNumber){

        Map<String, Object> result = new HashMap<>();

        Set<User> collect = new HashSet<>();

        // 存放当前选手的抢答时间
        Set<String> range = redisTemplate.opsForZSet().range(Constants.QUESTION_QD_HISTORY_PREFIX + questionNumber, 0, -1);
        if(range != null && !range.isEmpty()) {
            collect = range.stream().map(str -> {
                return JSONObject.parseObject(str, User.class);
            }).collect(Collectors.toSet());

        }
        result.put("qdHistory",collect); // 返回抢答结果

        return result;
    }

}
